package reg.data;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import reg.domain.Manifestacion;
import reg.domain.Usuario;

public class JDBCManifestacionDAO implements IManifestacionDAO {

	@Override
	public List<Manifestacion> seleccionaTodasManifestaciones() {
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		List<Manifestacion> searchResults = new LinkedList<Manifestacion>();
		ResultSet result = null;

		try {
			String sql = "SELECT * FROM Manifestacion";
			stmt = conn.prepareStatement(sql); 
			stmt.executeQuery();
			result = stmt.executeQuery();

			while (result.next()) {
				Manifestacion m = new Manifestacion();
				m.setNombre(result.getString("nombre"));
				m.setDescripcion(result.getString("descripcion"));
				m.setFecha(result.getDate("fecha"));
				m.setCiudad(result.getString("ciudad"));
				m.setOrganizadores("organizadores");
				// TODO SetCreador!!!!ones tenemos que ver como hacemos esto.
				// obviamente es una
				// consulta pero como la BD no es estable aun no la voy a hacer.
				// saludos y muy buen foro.
				m.setCreador(null);
				searchResults.add(m);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return searchResults;

	}

	@Override
	public List<Manifestacion> seleccionaManifestacionesAPartirDeFecha(Date fechaUltimoLogin) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		List<Manifestacion> searchResults = new LinkedList<Manifestacion>();
		ResultSet result = null;

		try {
			String sql = "SELECT * FROM Manifestacion WHERE fecha > '"+fechaUltimoLogin+"'";
			stmt = conn.prepareStatement(sql); 
			stmt.executeQuery();
			result = stmt.executeQuery();

			while (result.next()) {
				Manifestacion m = new Manifestacion();
				m.setNombre(result.getString("nombre"));
				m.setDescripcion(result.getString("descripcion"));
				m.setFecha(result.getDate("fecha"));
				m.setCiudad(result.getString("ciudad"));
				m.setOrganizadores("organizadores");
				// TODO SetCreador!!!!ones tenemos que ver como hacemos esto.
				// obviamente es una
				// consulta pero como la BD no es estable aun no la voy a hacer.
				// saludos y muy buen foro.
				m.setCreador(null);
				searchResults.add(m);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return searchResults;
	}

	@Override
	public List<Usuario> amigosEnManifestacion(String user, String nombreMani) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		//List<Usuario> searchResults = new LinkedList<Usuario>();
		ResultSet result = null;
		String manifID = null;
		// Capturamos el id de la manifestacion
		try {
			String sql = "SELECT idManifestacion FROM Manifestacion WHERE nombre ='" + nombreMani + "'";
			stmt = conn.prepareStatement(sql); 
			stmt.executeQuery();
			result = stmt.executeQuery();
			
			while (result.next()) {
				manifID = result.getString("idManifestacion");
			}
			
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}

		// ////////////////////////////////////////

		Connection conn4amigosMani = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt4AmigosMani = null;
		List<Usuario> searchResults4AmigosMani = new LinkedList<Usuario>();
		ResultSet result4AmigosMani = null;

		try {
			String sql4AmigosMani = "SELECT * FROM Usuarios WHERE idUsuario IN (SELECT idUsuario FROM (SELECT idUsuario FROM Usuarios WHERE idUsuario IN (SELECT idAmigo FROM (SELECT idUsuario,nombre,idAmigo FROM Usuarios NATURAL JOIN Amigos ) AS T WHERE nombre ='"+user+"'))AS N NATURAL JOIN Asistencia  AS K WHERE idManifestacion = '"+manifID+"' )";
			stmt4AmigosMani = conn4amigosMani.prepareStatement(sql4AmigosMani); 
			stmt4AmigosMani.executeQuery();
			result4AmigosMani = stmt4AmigosMani.executeQuery();

			while (result4AmigosMani.next()) {
				// TODO Tenemos que capturar los amigos con otra consulta!!!!!!
				Usuario u = new Usuario();
				u.setNombre(result4AmigosMani.getString("nombre"));
				u.setContrasenya(result4AmigosMani.getString("contrasenya"));
				u.setDescripcion(result4AmigosMani.getString("descripcion"));
				u.setFechaRegistro(result4AmigosMani
						.getDate("fechaRegistro"));
				u.setEdad(result4AmigosMani.getInt("edad"));
				u.setPrivilegios(result4AmigosMani.getBoolean("privilegios"));
				u.setUltimoLogin(result4AmigosMani.getDate("ultimoLogin"));
				u.setCiudad(result4AmigosMani.getString("ciudad"));

				searchResults4AmigosMani.add(u);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result4AmigosMani != null)
					result4AmigosMani.close();
				if (stmt4AmigosMani != null)
					stmt4AmigosMani.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}

		return searchResults4AmigosMani;
	}

	
	public int asistenciaManifestacion(int idManifestacion) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		
        String sql = "SELECT COUNT(*) FROM Asistencia WHERE idManifestacion = ? AND estado = 1";
        PreparedStatement stmt = null;
        ResultSet result = null;
        
        int asistentes = -1;

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idManifestacion);
            result = stmt.executeQuery();

            result.next();
            
            asistentes = result.getInt(1); //valor de la primera columna
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
		
		
		return asistentes;
	}

	@Override
	public Manifestacion selecciona(int idManifestacion) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		String sql = "SELECT * FROM Manifestacion WHERE idManifestacion = ?";
        PreparedStatement stmt = null;
        ResultSet result = null;
        
        Manifestacion m = new Manifestacion();

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idManifestacion);

            result = stmt.executeQuery();

            result.next();
            
            m.setNombre(result.getString("nombre"));
            m.setDescripcion(result.getString("descripcion"));
            m.setCiudad(result.getString("ciudad"));
            m.setOrganizadores(result.getString("organizadores"));
            m.setFecha(result.getDate("fecha"));
            m.setCreador(null);
            m.setIdManifestacion(result.getInt("idManifestacion"));
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

        return m;
	}



	@Override
	public List<Manifestacion> manifestacionSinAsistencia(int idUsuario) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		String sql = "SELECT * FROM Manifestacion WHERE fecha >= ? AND idManifestacion NOT IN (SELECT idManifestacion FROM Asistencia WHERE idUsuario = ?)";
        PreparedStatement stmt = null;
        ResultSet result = null;
        
        List <Integer> idManifestaciones = new LinkedList<Integer>();
        List<Manifestacion> manifestacionResult= new LinkedList<Manifestacion>();
        
        try {
            stmt = conn.prepareStatement(sql);
            Date date = new Date(Calendar.getInstance().getTimeInMillis());
            stmt.setDate(1, date);
            stmt.setInt(2, idUsuario);

            result = stmt.executeQuery();

            while (result.next()) {
                idManifestaciones.add(result.getInt(1));
            }
            
            
            for(int idManifestacion:idManifestaciones){
            	manifestacionResult.add(selecciona(idManifestacion));
            }
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

        return manifestacionResult;
	}

	@Override
	public int numeroAmigosEnManifestacion(int idManifestacion, int idUsuario) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		String sql = "SELECT idUsuario FROM RegulacionInformatica.Asistencia WHERE idManifestacion = ? AND estado = 1 ";
        PreparedStatement stmt = null;
        ResultSet result = null;
        
        List <Integer> idAsistentes = new LinkedList<Integer>();
        List <Integer> idAmigos =  new LinkedList<Integer>();
        int amigos = 0;
        
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idManifestacion);

            result = stmt.executeQuery();

            while (result.next()) {
                idAsistentes.add(result.getInt(1));
            }
                       
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        //Segunda consulta
        
        sql = "SELECT idAmigo FROM RegulacionInformatica.Amigos WHERE idUsuario = ?";
        stmt = null;
        result = null;
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idUsuario);

            result = stmt.executeQuery();

            while (result.next()) {
                idAmigos.add(result.getInt(1));
            }
                       
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
		for(int idAsistente:idAsistentes){
			for(int idAmigo:idAmigos){
				if (idAsistente == idAmigo){
					amigos++;
				}
			}
		}
		return amigos;
	}
}
